package com.miage.itrading.metier;

import java.net.URL;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;

import com.miage.itrading.dao.RSSDao;
import com.miage.itrading.utils.Const;

import de.nava.informa.core.ChannelIF;
import de.nava.informa.core.ItemIF;
import de.nava.informa.impl.basic.ChannelBuilder;
import de.nava.informa.parsers.FeedParser;

public class RSS extends Thread {

	private String[] url = {	"http://rss.lefigaro.fr/figaro-bourse",
								"http://syndication.lesechos.fr/rss/rss_une.xml",
								"http://www.capital.fr/rss2/feed/actus-a-la-une.xml",
								"http://www.zonebourse.com/rss/FeedAnalyses.php",
								"http://www.tradingsat.com/rssfeed.php",
								"http://www.lemonde.fr/rss/sequence/0,2-3234,1-0,0.xml"
						   };
	
	private Date[] lastRecords = new Date[url.length];
	
	@SuppressWarnings("deprecation")
	public void run()  {
		RSSDao dao = new RSSDao();
		Date lastRecord;
		Date last;
		int nbArticles;
		
		while (true) {
			try {
				for (int i=0 ; i<url.length ; ++i) {
					ChannelIF channel = FeedParser.parse(new ChannelBuilder(), new URL(url[i]));
					
					/**
					 * Pour la première boucle on récupère le dernier enregistrement en base,
					 * ensuite on conservera cette valeur en local pour éviter des requêtes inutiles
					 */
					if (lastRecords[i] == null) {
						lastRecord = dao.getLastRecord(url[i]);
					}
					else {
						lastRecord = lastRecords[i];
					}
					
					last = lastRecord;
					
					Collection<ItemIF> cItems = channel.getItems();
					Iterator<ItemIF> iItems = cItems.iterator();
					
					
					for (nbArticles=0 ; iItems.hasNext() ; ) {
						ItemIF item = iItems.next();
						
						if (lastRecord == null || item.getDate().after(lastRecord)) {
							/**
							 * On conserve la dernière date
							 */
							if (last == null || item.getDate().after(last))
								last = item.getDate();
							
							++nbArticles;
							
							dao.add(url[i], item.getLink().toExternalForm(), item.getTitle(), item.getDate());
						}
						/**
						 * Les flux ne sont pas forcément écrits de l'article le plus récent au plus ancien,
						 * on les parcoure entièrement à chaque fois
						 */
//						else {
//							break;
//						}
					}
					
					lastRecords[i] = last;
					System.out.println(new Date().toLocaleString() + " - RSS - " + nbArticles + " - " + url[i]);
					dao.flush();
				}
				
				sleep(Const.INTERVALLE_RSS * 1000);
		          
		    } catch (Exception e) {
				e.printStackTrace();
				
			}
		}
	}
}
